import { REDIRECT_NAME } from "@/router/constant";
import { isString } from "@/utils/is";
import { unref } from "vue";
import { useRouter, type Router, type RouteLocationRaw } from "vue-router";
function handleError(e: Error) {
    console.error(e);
  }
// page switch
export function useGo(_router?: Router) {
    let router:any;
    if (!_router) {
      router = useRouter();
    }
    const { push, replace } = _router || router;
    function go(opt:any, isReplace = false) {
      if (!opt) {
        return;
      }
      if (isString(opt)) {
        isReplace ? replace(opt).catch(handleError) : push(opt).catch(handleError);
      } else {
        const o = opt as RouteLocationRaw;
        isReplace ? replace(o).catch(handleError) : push(o).catch(handleError);
      }
    }
    return go;
  }

/**
 * @description: redo current page
 */
export const useRedo = (_router?: Router) => {
    const { push, currentRoute } = _router || useRouter();
    const { query, params = {}, name, fullPath, path } = unref(currentRoute.value);
    function redo(): Promise<boolean> {
      return new Promise((resolve) => {
        if (name === REDIRECT_NAME) {
            resolve(false);
            return;
          }
        if (name && Object.keys(params).length > 0) {
          params['_redirect_type'] = 'name';
          params['path'] = String(name);
        } else {
          params['_redirect_type'] = 'path';
          params['path'] = fullPath;
        }
        push({ name: REDIRECT_NAME, params, query }).then(() => resolve(true));
      });
    }
    return redo;
  };